import re

class Sort:
    # 排序类

    '''
    unsorted_list: 未排序的list
    '''

    def __init__(self, unsorted_list):
        self.unsorted_list = unsorted_list
        self.re_digits = re.compile(r'(\d+)')  # 正则表达式，\d是匹配数字字符[0-9]，+匹配一个或多个，r为了防止转义

    def emb_numbers(self,s):
        pieces = self.re_digits.split(s)
        # 因为是正则匹配数字字符，所以数字出现在奇数位，故此处步长为2
        # map函数：第一个参数 function 以参数序列中的每一个元素调用 function 函数，返回包含每次 function 函数返回值的新列表
        pieces[1::2] = map(int, pieces[1::2])  # 对偶数位做整数化处理，为了后面排序做准备
        return pieces

    # 第一种字符串内数字的分类方法
    def sort_strings_with_emb_numbers(self):
        aux = [(self.emb_numbers(s), s) for s in self.unsorted_list]
        aux.sort() # 分类方法，因为aux[0]是split开的字符串，排序会根据里面第一个不同的部分进行排序（个人）
        return [s for __, s in aux]

    # 第二种字符串内数字的分类方法
    def sort_strings_with_emb_numbers2(self):
        return sorted(self.unsorted_list, key=self.emb_numbers)
